package module

import "net/http"

const (
	//未初始化
	SCHED_STATUS_UNINITIALIZED status = 0
	//正在初始化
	SCHED_STATUS_INITIALIZING status = 1
	//已经初始化
	SCHED_STATUS_INITIALIZED status = 2
	//正在启动
	SCHED_STATUS_STARTING = 3
	//已启动状态
	SCHED_STATUS_STARTED = 4
	//正在停止
	SCHED_STATUS_STOPING = 5
	//已停止
	SCHED_STATUS_STOPED = 6
)

type Scheduler interface {
	//初始化调度器
	//requestArgs 请求相关参数
	//dataArgs 数据相关参数
	//moduleArgs 组件相关参数
	Init(requestArgs RequestArgs, dataArgs DataArgs, moduleArgs ModuleArgs)

	//启动调度器执行爬取数据
	//r 第一个请求
	Start(r http.Request) error

	//执行流程终止
	Stop() error

	//调度器状态
	Status() status

	//所有的调度器错误管道
	ErrorChan() <-chan error

	//判断调度器是否为空闲状态
	Idel() bool

	//获取调度器摘要
	Summary() SchedSummary
}

type status uint8

//请求相关的参数容器类型
type RequestArgs struct {
	//接受的URL的主域名列表 （广度）
	AcceptedDomains []string
	//最大深度 （深度）
	MaxDepth uint64
}

//参数容器类型
type DataArgs struct {
	//请求缓冲器的容量
	ReqBufferCap uint32 `json:"req_buffer_cap"`
	//请求缓冲器最大数量
	ReqMaxBufferNumber uint32 `json:"req_max_buffer_number"`
	//响应缓冲器的容量
	RespBufferCap uint32 `json:"resp_buffer_cap"`
	//响应缓冲器的最大数量
	RespMaxBufferNumber uint32 `json:"resp_max_buffer_number"`
	//条目缓冲器的容量
	ItemBufferCap uint32 `json:"item_buffer_cap"`
	//条目缓冲器的最大数量
	ItemMaxBufferNumber uint32 `json:"item_max_buffer_number"`
	//错误缓冲器的容量
	ErrorBufferCap uint32 `json:"error_buffer_cap"`
	//错误缓冲器的最大数量
	ErrorMaxBufferNumber uint32 `json:"error_max_buffer_number"`
}

//组件容器
type ModuleArgs struct {
	//下载器列表
	Downloader []Downloader
	//分析器列表
	Analyzer []Analyzer
	//条目处理管道列表
	Pipeline []Pipeline
}

//参数容器接口
type Args interface {
	Check() bool
}

//调度器接口摘要
type SchedSummary interface {
	Struct() SummaryStruct
	String() string
}

//TODO
type SummaryStruct struct {
	RequestArgs RequestArgs  `json:"request_args"`
	DataArgs    DataArgs     `json:"data_args"`
	ModuleArgs  ModuleArgs   `json:"module_args"`
	Status      string       `json:"status"`
	Downloader  []Downloader `json:"downloader"`
	Analyzer    []Analyzer   `json:"analyzer"`
	Pipeline    []Pipeline   `json:"pipeline"`
}
